dB−BASIC ――――――――――――――――――――――――――――――――――――――― I/O 1983年 4月号掲載 X1 マシン語 0000H−07FFFH BASIC コールド・スタート 01640H ホット ・スタート 0168AH 起動方法 IPLから起動 ――――――――――――――――――――――――――――――――――――――― ・……………………………………………………………………・ : X1用にBASICインタープリタを作りました。  : :これは従来のBASICインタープリタの概念を    : :突きやぶるEような、                : :拡張性や使いやすさに重点がおかれています。     : :たとえばDEFCMDで自由にBASICを拡張したり、: :CANCEL文でサブルーチンのRETURN文で   : :サブルーチンのRETURN文を           : :なかったことにしてしまったりとか、         : :いろいろ面白い使い方ができます。          : ・……………………………………………………………………・ /=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=        特  徴 /=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/= (1)拡張性があり、DEFCMDコマンドで中間言語で定義できます。 (2)コンパクトにまとめ、フリーエリアは32Kバイトあります。 (3)コンパクトにまとめた結果、高速になりました。 /=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=        入力方法 /=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/= まず、’83年2月号の“MASK”モニタをロードし、 3月号の“チェンジ・メモリ”を使って入力すると簡単です。 きちんとチェックサムが合っているかどうか確かめてください。 ここで一応テープにセーブしておきます。 そこでおもむろにJ1640[RET] してBASICを起動してみます。 暴走したら、テープからロードしてチェックサムを確かめてください。 長いプログラムなので、間違いがありがちです。 暴走しないときは 後に書いてあるステートメントなどを入力して確かめます。 完成したら、モニタの021C番地とその次を 40,16に書き換えて 0000〜8000までセーブします。 これをIPLでロードすればdB−BASICが起動します。 なお、ホット・スタートは168AHです。           ベンチマーク・テスト結果 ・――――――――――――――――――――――――――――――――・ |プログラムNo.|dB−BAISC(秒)|Hu−BASIC(秒)| |――――――――+―――――――――――+―――――――――――| |   1    |     36    |     62    | |   2    |    261    |    920    | |   3    |    474    |    580    | |――――――――+―――――――――――+―――――――――――| |   計    |    771    |   1562    | ・――――――――――――――――――――――――――――――――・ ベンチマーク・プログラム ・――――――――――――――――――――――――・ |         プログラム1         | |・――――――――――――――――――――――・| ||10 TIME$="00:00:00" || ||20 FOR X=1 TO 1000 || ||30 S=SIN(X) || ||40 C=COS(X) || ||50 L=LOG(X) || ||60 NEXT X || ||70 PRINT TIME$ || ||80 END || |・――――――――――――――――――――――・| |                        | |         プログラム2         | |・――――――――――――――――――――――・| ||5 SCREEN 0,0,0 || ||10 TIME$="00:00:00" || ||20 FOR L=1 TO 1000 || ||30 X=INT(RND(1)*639+1) || ||40 Y=INT(RND(1)*199+1) || ||50 LINE (0,0)-(X,Y),PSET,INT(RND(1)*7+1) || ||60 CIRCLE(320,100),INT(RND(1)*100+1) || ||70 NEXT L || ||80 PRINT TIME$ || ||90 END || |・――――――――――――――――――――――・| |                        | |         プログラム3         | |・――――――――――――――――――――――・| ||5 SCREEN 0,0,0 || ||10 TIME$="00:00:00" || ||20 FOR C=1 TO 6 || ||30 PAINT(320,100),C || ||40 NEXT C || ||50 PRINT TIME$ || ||60 END || |・――――――――――――――――――――――・| |                        | ・――――――――――――――――――――――――・  dB−BASICとHu−BASICとの違い ・――――――――――――――――――――――・ |                      | | ●単精度の桁数が6桁(Huは8桁)。   | | ●ファイル・ディスクリプタがない。    | |                      | ・――――――――――――――――――――――・ このdB−BASICの具体的な使い方などを次号から連載します。 Huで使えてdBで使えない命令 ・―――――――――――――――――――――――――――――――――――――・ |●DEVICE                              | |●LFILES                              | |※SAVEM                               | |●CHAIN                               | |●KILL                                | |●LET                                 | |●WRITE[#]                            | |●OPTION BASE                         | |●REPEAT〜UNTIL                        | |●WHILE〜WEND                          | |●DEFUSR                              | |●RANDOMIZE                           | |●MAXFILES                            | |●DEVI$                               | |●DEVO$                               | |●INIT                                | |※CREV                                | |※CFLASH                              | |●WINDOW                              | |※POLY                                | |●CANVAS                              | |●LAYER                               | |●GET@                                | |●PUT@                                | |●OPTION SCREEN                       | |●REPEAT[ON/OFF]                      | |●KEY[ON/OFF]                         | |●ON KEY GOSUB                        | |※PAUSE                               | |●WAIT                                | |●TVPW/CRT/CHANNEL/                   | |※VOL/SCROLL                          | |●EJECT/CSTOP/FAST/REW                | |●MIRROR$                             | |●MKI$/MKS$/MKD$                      | |●CVI/CVS/CVD                         | |●EOF                                 | |※CHARACTER$                          | |●INPUT$                              | |●STRPTR                              | |●DTL                                 | |●LABEL                               | |                                     | |ただし                                  | |●CREV/CFLASHはCOLOR命令で代用できる。          | |●SAVEMは、モニタのSAVEで代用。                 | |●POLYは、CIRCLEで代用。                    | |●PAUSEは、WAITと同じ。                     | |●CHARACTER$はSCRN$の3番の引数を省略したのと同じ。    | |●カセット制御命令はCMTで代用。                    | |●LABEL                               | | LABEL ABC は※"ABC"と同じ。                       | ・―――――――――――――――――――――――――――――――――――――・ dBで使えてHuで使えないもの ・―――――――――――――――――――――――――――――――――――――・ |●EXEC(文字列)                           | | これは文字列の値を中間言語とみなして実行する。             | | 例)EXEC A$                               | |●XFER$(文字列)                          | | これは文字列の値をソースとみなし中間言語に変換するもの。        | | 例)A$=XFER$(B$)                            | | この命令はEXECと一緒に使うためにある。たとえば、            | | EXEC XFER$("?SQR(2)") とすると"1.141421"と表示される。         | |●DEFCMD(”文字列”)=アドレス                  | | 文字列をコマンドとみなし、実行アドレスを指定されたアドレスに      | | 割り当てる(ユーザー定義のコマンド設定)。               | | 例)DEFCMD("MUSIC")=&H3000                       | | これを実行するとMUSIC が中間言語に割り当てられる。           | | そしてその実行アドレスは3000H番地である。               | | 中間言語の値は定義された順になっている。                | | 定義のクリアはDEFCMD("")で行なわれる                  | | (すべてのユーザーコマンドをクリア)。                 | |●CASE                                | | 条件判断用コマンドでCASE TRUE OFとCASE FALSE OF とかある。       |                               | | 例)100 CASE TRUE OF                          | |   110 A=10:?"ABC"                           | |   120 A=20:?"DEF"                           | |   130 A=30:?"GHI"                           | |   140 CASE END                            | | CASE TRUE OF は次の行以下の条件(この場合は A=10)が合っている場合、  | | 次の命令を実行し、違う場合は、次の行に進む。              | | CASE FALSE OF は次の行以下の条件が違う場合に次の命令を実行する。    | | ただし、CASE文の最後には必ずCASE ENDを入れる。             | | また、CASE文の中にELSEも使える。                    | |  CASE TRUE OF                             | |    |                                | |  ELSE: ? "END"                             | |  CASE END                               | | これはいずれの条件に合わなかった場合の処理。              | |●POKW[@]                             | | POKEの2バイト命令                         | | 例)POKE ADR,&H20:POKE ADR+1,&H30 これと                | |   POKW ADR,&H3020 と同じ。                      | | @を付けた場合はI/Oアドレスとなります。               | |●PEEW[@]                             | | PEEKの2バイト命令                         | |●PRINT$〜                             | | 縦書きプリント命令で                          | | 例)?$"ABCD"とすると                          | | ・――――――――――――・                      | | | A          |                      | | | B          |                      | | | C          |                      | | | D          |                      | | ・――――――――――――・                      | | CRTに上のように表示される。                     | |●USR                                 | | 直接Z80のレジスタに値を渡してマシン語サブルーチンをコールする命令。  | | 例)USR&HA000,&H1000,&H2000,&H3000,&H40                 | | 上の例ではBC、DE、HL、Aレジスタにそれぞれ1000H、2000H、3000H、40Hを  | | セットしてサブルーチンA000Hをコールします。              | | ただし、Aレジスタの引数だけ1バイトなので往意してください。      | | またレジスタの値は省略できます。                    | |●INPUT                               | | INPUT は通常のINPUT の他にフォーマットを組んだINPUT ができます。    | | 例)INPUT "X=";(10,"1234")A                       | | 上の命令を実行すると次のように表示され入力待ちになります。       | | X=[1]234                             | |   ↑                                 | |   カーソルの位置                           | | すなわち、( )内で10は入力できる文字数、"1234"はエコーバックする   | | 文字列を表わします。                          | | 文字数、エコーバックする文字列は式が使え、また省略可能です。      | | 例)INPUT "B=";(A*2,)A                         | | ただし入力の文字数を制限するとカーソルの移動範囲が           | | その文字数分だけになります。                      | |●GOTO、GOSUB                          | | GOTO、GOSUB はGOTO "ラベル" 、GOTO行番号の他にGOTO変数が使えます。    | | 例)GOTO A                               | |   GOSUB B                               | |●DEG(X)                              | | これは、Xの値をラジアンとみなし、度に交換するものです。        | | 例)X=DEG(3.14159)                           | |●ON BREAK GOSUB                      | |●COLOR                               | | COLORキャラクタ色コード,ボーダー色,フラッシュ,リバース                  | |●CIRCLE                              | | CIRCLE(X,Y),R,C,比率,スタート角,エンド角,ステップ角               | ・―――――――――――――――――――――――――――――――――――――・ エラーメッセージ ・―――――――――――――――――――――――――――――――――――――・ |MER1:Syntax Error                    | |     コマンドまたは文の記述に誤まりがある。             | |MER2:Illegal Function Cell           | |     ステートメントや関数で機能の呼び方が誤っている。        | |MER3:Overflow                        | |     演算結果や入力された数値が評される範囲をこえている。      | |MER4:Type Mismatch                   | |     式の左辺、右辺、関数の引数などにおいて変数または定数      | |     の形が合わない。                        | |MER5:Misissing Operand               | |     ステートメント中に必要なパラメータ(オペランド)が抜      | |     けている。                           | |MER6:String Overlow                  | |     文字定数または、文字変数内の文字数が255文字を超えて     | |     いる。                             | |MER7:Undefine Line N0.               | |     指定された行番号が定義されていない。行番号の指定が行      | |     なわれていない。                        | |MER8:RETURN without GOSUB            | |     GOSUB文で呼び出されていないのに、RETURN文が出    | |     てきた。                            | |MER9:Can’t Continue                  | |     CONTコマンドによるプログラムの実行再開ができない。     | |     (ポインタの値が壊されている)。                | |MER10:Too Complex                     | |     文字式が複雑すぎる(カッコの重なりネスティング)が深      | |     すぎるなど。                          | |MER11:Memory Over                     | |     メモリ容量が足りなくなった(プログラムが大きすぎる。      | |     スタックを使い果たした。配列が大きすぎるなど)。        | |MER12:Device not Open                 | |     デバイスのファイル・モードが開いていない。デバイスが      | |     使用可能な状態にない。                     | |MER13:NEXT without FOR                | |     NEXTに対応するFOR文がない(入れ子構造が正しくない)。  | |MER14:Duplicate Defintion             | |     同じ名前の配列を2度宣言している(ERASE文を忘れて行    | |     なった場合など)。                       | |MER15:Subscript Out of Range          | |     配列変数の添字の値が規定範囲から外れている。          | |MER16:Device offline                  | |     使おうとしたI/Oデバイスがつながっていない(オンライ     | |     ンになっていない)。                      | |MER17:Set Tape                        | |     カセットテープがセットされていないのに、読み込みまた      | |     は書き込みを行なおうとした。                  | |MER18:Check Sum Error                 | |     テープリード・エラー                      | |MER19:Write Protect                   | |     誤消去防止用のツメがおれているカセットテープをセット      | |     して書き込みを行なおうとした。                 | |MER20:Tape End                        | |     カセットテープが終わってしまったのに読み込みまたは書      | |     き込みを行なおうとした。                    | |MER21:Out of Data                     | |     READ文によって読むべきデータがない。            | |MER22:CASE not Defined                | |     CASE文がない。                       | |MER23:CASE Already Defined            | |     CASE文の中に再びCASE文がある。             | |MER24:CANCEL without GOSUB            | |     GOSUB文がないのにCANCEL文を使った。         | |MER25:String Bufer Overflow           | |     文字領域がオーバーフローした。                 | |MER26:Command Bufer Overflow          | |     ユーザー定義コマンド領域がいっぱいになった。          | |MER27:RESUME without ERROR            | |     エラーが発生していないかまたは、エラー処理ルーチンに      | |     制御を移さなかったのにRESUME文を実行しようとした。    | |MER28:Aleady OPEN                     | |     ファイルはすでにオープンされている。              | |MER29:Input Past End                  | |     ファイル中のすべてのデータを読みつくした後に、さらに      | |     入力文が実行された。                      | |MER30:Undefined Function              | |     定義されていない関数を参照している。              | ・―――――――――――――――――――――――――――――――――――――・ コマンド、ステートメント リファンレス(一部) ・―――――――――――――――――――――――――――――――――――――・ |●AUTO                                | |[機能]行番号を自動的に発生します。[RET]キーを押すと次の行番号が    | |   発生します。                            | |[書式]AUTO〔#〕〔〔行番号〕〔,増分値・減分値〕〕              | |   #を付加するとREM(')モードの設定、解除になります。         | |   増分値・減分値は止数を入れると増加、                | |   負数を入れると滅少していきます。                  | |                                     | |●CANCEL                              | |[機能]サブルーチンにおいてRETURNによる呼び出した             | |   プログラムヘの復帰を取り消します。                 | |[書式]CANCEL                               | |   1番最後に実行した GOSUB文の次に戻るのを取り消します。       | |                                     | |●CASE                                | |[機能]条件判断を行ない、真(または偽)のとき、以下に続く実行を      | |   行なわせます。                           | |[書式]CASE TRUE OF(真)または                      | |   CASE FALSE OF(偽)                         | |   CASE END                              | |                                     | |●CIRCLE(グラフィックRAMが必要です)。             | |[機能]画面上の任意の座標を中心点として楕円(円)または、円弧を      | |   描きます。ステップ角度を設定すると多角形も楠けます。        | |[書式]CIRCLE(x,y),半径,〔色〕,〔比率〕,〔開始角度〕,〔終了角度〕,    | |   〔ステップ角度〕                          | |                                     | |●CLEAR                               | |[機能]すべての数値変数を0に、文字変数を令文字列("":ヌル)       | |   に初期設定します。また、文字領域も設定します。           | |[書式]CLEAR〔文字領域の大きさ〕,〔テキストのエンド・アドレス〕           | |                                     | |●COLOR                               | |[機能]画面表示の文字、グラフィックの色および背景色を指定し、       | |   また、文字の反転、点滅も指定します。                | |[書式]COLOR〔カラーコード〕〔,背景色カラーコード〕〔,点滅モード・スイッチ〕        | |   〔,反転モード・スイッチ〕                         | |   点滅モード・スイッチ、反転モード・スイッチ は0でオフ、1でオン。           | |                                     | |●DEFCMD                              | |[機能]このコマンドで設定された文字列をコマンドと定義し、         |     その実行アドレスを指定されたアドレスに割り当てます。        | |[書式]DEFCMD(〔文字列])=〔アドレス〕                     | |                                     | |●DEG                                 | |[機能]ラジアン(RADIANT〉を度(DEGREE)に変換します。    | |[書式]DEG(ラジアンの値)                           | |                                     | |●ERROR                               | |[機能]故意的にエラー発生をシミュレートしたり、ユーザのエラー       | |   番号の定義を可能にしたりします。                  | |[書式]ERROR エラー番号                            | |                                     | |●EXEC                                | |[機能]これに続く中間言語の入った文字列を実行します。           | |[書式]EXEC〔中間言語の文字列〕                      | |                                     | |●FIND                                | |[機能]指定された文字列をプログラムのすべての行、             | |   または、指定した行番号の中から探し出し、              | |   その行をディスプレイまたはプリンタに表示出力します。        | |[書式]FIND〔#]"〔文字列〕",[第1行番号〕〔{,}〔第2行番号)〕        | |   #をつけるとプリンタに出力。                    | |                                     | |●FOR−NEXT その1                        | |[機能]プログラムの指された部分を繰り返し実行します。           | |[書式]FOR制御変数=式1(初期値)TO式2(最終値)〔STEP式3(増分)〕        | |                                     | |●FOR−NEXT その2(NEXT)                  | |[機能]FOR〜NEXTループの終わりを指定します。            | |[書式]NEXT〔制御変数名〕                         | |                                     | |●FRE                                 | |[機能]メモリの各未使用領域の大きさを与えます。              | |[書式]FRE(式)                               | |                                     | |●GOSUB                               | |[機能]BASICのプログラムのサブルーチンを呼び出し、          | |   サブルーチン終了後はGOSUB文の直後の文に戻ります。       | |[書式]GOSUB〔行番号または"ラベル名"または、数値変数〕            | |                                     | |●GOTO                                | |[機能]指定されたプログラムの場所にプログラムの実行を移します。      | |[書式]GOTO〔分番号または、ラベルまたは、数値変数〕              | |                                     | |●INPUTその1                            | |[機能]キーボードから入力されるデータを読み取り、             | |   指定された変数へ入力します。                    | |[書式]INPUT〔"プロンプト・メッセージ";〕変数名〔,〔プロンプトメッセージ";〕変数名……〕 | |                                     | |●INPUTその2(フォーマット指定)                  | |[機能]キーボードよりの入力にフォーマット(形式指定)をします。      | |[書式]INPUT〔"プロンプト・メッセージ"{;or,}〕(指定文字数,エコーバック文宇列)変数名   | |                                     | |●LISTその1                             | |[機能]プログラムをCRTに表示します。                  | |[書式]LIST〔.〕〔第1行番号〕〔{-or,}〔第2行番号〕〕            | |   LIST. でエラー行なって修正入力した次の行が表示されます。      | |   またLLIST とするとプリンタに出力します。              | |                                     | |●LISTその2                             | |[機能]プログラムの全部または、一部をファイルとしてカセット・テープに   | |   ASCII形式で書き込みます。                   | |[書式]LIST "ファイル名"〔,〔第1行番号〕〔{-or,}〔第2行番号〕〕〕       | |                                     | |●MON                                 | |[機能]BASICのコマンド・レベルからモニタのコマンド・レベルに移ります。| |[書式]MON                                 | |   モニタからBASICに戻るにはRコマンドを使います。        | |                                     | |●NEW                                 | |[機能]メモリにあるプログラムおよび変数をすべて消去します。        | |[書式]NEW                                 | |                                     | |●NEW ON                              | |[機能]テキストの開始アドレスを設定し、テキストおよび変数をクリアします。 | |[書式]NEWON〔アドレスまたは数式〕                      | |                                     | |●ON BREAK GOSUB、ON BREAK GOTO        | |[書式]BREAKキー が押されたときの処理を行ないます。            | |[書式]ON BREAK GOSUB 行番号 または                    | |   ON BREAK GOTO 行番号                        | |                                     | |●ON〜GOTO                             | |[機能]飛び先(無条件分岐)の選択を行ないます。              | |[書式]ON式GOTO飛び先(行番号またはラベル名または数値変数)〔,飛び先〕…    | |                                     | |●ON〜GOSUB                            | |[機能]式の値により、サブルーチンの選択を行ないます。           | |[書式]ON式GOSUBサブルーチンの飛び先(行番号またはラベルまたは変数名)       | |   〔,サブルーチンの飛び先〕…                       | |                                     | |●OPEN                                | |[機能]カセットテープに対してファイルを開く処理を行ないます。       | |[書式]OPEN"モード,#(ファイル番号),"〔ファイル名〕"                 | |   モードはIでINPUT 、OでOUTPUT。                  | |                                     | |●PEEW                                | |[機能]PEEKの2バイト命令です。                    | |[書式]PEEW〔@〕(番地)                           | |   @を付けるとI/Oアドレスになります。               | |                                     | |●PLAY                                | |[機能]指定した音を鳴らし、音楽の演奏をします。              | |[書式]PLAY "MML〔:MML〔:MML〕〕"                     | |                                     | |●POKW                                | |[機能]POKEの2バイト命令です。                    | |[書式]POKW〔@〕書き込み番地,2バイト・データ                  | |   @を付けるとI/Oアドレスになります。               | |                                     | |●PRINT$                              | |[機能]縦書きの画面表示を行ないます。                   | |[書式]PRINT$〔算術式,文字列式など〕                    | |                                     | |●RETURN                              | |[機能]サブルーチンを終了し、GOSUB が行なわれた次のプログラム文、     | |   または次の行番号プログラムの実行を戻します。            | |[書式]RETURN                               | |                                     | |●RND                                 | |[機能]0と1の間の乱数を与えます。                    | |[書式]RND(式)                               | |                                     | |●RUNその1                              | |[機能]メモリにあるプログラムの実行を始めます。              | |[書式]RUN〔行番号〕                            | |                                     | |●RUNその2                              | |[機能]指定されたファイル名のプログラムをカセットテープから        | |   ロードし、実行します。                       | |[書式]RUN"ファイル名"                             | |                                     | |●SAVE                                | |[機能]メイン・メモリ内にあるプログラムをファイルとして、         | |   カセットテープに記録します。                    | |[書式]SAVE"ファイル名"〔,A〕                         | |   Aを指定したときはプログラムをASCII形式でセーブします。    | |                                     | |●TRACE(ONまたはOFF)                     | |[機能]プログラムの実行状態を追跡し、またその状態を解除します。      | |[書式]TRACE ON またはTRACE OFF                      | |                                     | |●USR                                 | |[機能]直接Z80(CPU)のレジスタに値を渡してマシン語サブルーチン    | |   をコールします。                          | |[書式]USR指定アドレス,〔BCレジスタのデータ〕,〔DEレジスタのデータ〕,〔HLレジスタのデータ〕, | |   〔Aレジスタのデータ〕                          | |                                     | |●WIDTH                               | |[機能]画面に表示する文字の桁数および、画面サイズを設定します。      | |[書式]WIDTH〔画面1行の文字桁数〕                     | |                                     | |●WAIT                                | |[機能]指定した時間だけ、プログラムの実行を停止します。          | |[書式]WAIT引数                              | |                                     | |●XFER$                               | |[機能]指定の文字列を中間言語に変換します。                | |[書式]XFER$(〔文字列〕)                          | |                                     | |●ラベル                                 | |[機能]飛び先の指定に行番号の代りに文字列を設定します。          | |[書式]行番号 *"〔ラベル名〕"                        | |                                     | ・―――――――――――――――――――――――――――――――――――――・